package ifes;

import java.util.Arrays;
import java.util.List;

/*
  Retorna o radical de uma palavra
 */
public class Stemmer {

    static String[] arr_vogais = {"a", "e", "i", "o", "u", "á", "é", "í", "ó", "ú", "â", "ê", "ô", "ã", "õ"};
    static List<String> vogais = Arrays.asList(arr_vogais);
    static String[] arr_consoantes = {"b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"};
    static List<String> consoantes = Arrays.asList(arr_consoantes);
    static String[] arr_removable_suffix_1 = {"ezas", "eza", "icos", "ico", "icas", "ica", "ismos", "ismo", "ável", "ível", "istas", "ista", "osos", "oso", "osas", "osa", "amentos", "amento", "imentos", "imento", "adoras", "adora", "adores", "ador", "aço~es", "aça~o", "antes", "ante", "ância"};
    static List<String> removable_suffix_1 = Arrays.asList(arr_removable_suffix_1);
    static String[] arr_removable_suffix_2 = {"aríamos", "eríamos", "iríamos", "ássemos", "êssemos", "íssemos", "aríeis", "eríeis", "iríeis", "ásseis", "ésseis", "ísseis", "aremos", "eremos", "iremos", "áramos", "éramos", "íramos", "ávamos", "asses", "esses", "isses", "astes", "estes", "istes", "áreis", "areis", "éreis", "ereis", "íreis", "ireis", "armos", "ermos", "irmos", "ardes", "erdes", "áveis", "irdes", "íamos", "ara~o", "era~o", "ira~o", "assem", "essem", "issem", "ariam", "eriam", "iriam", "arias", "erias", "irias", "arei", "erei", "irei", "aram", "eram", "iram", "avam", "arem", "erem", "irem", "ando", "endo", "indo", "adas", "idas", "arás", "aras", "erás", "eras", "irás", "avas", "íeis", "ares", "eres", "ires", "ados", "idos", "ámos", "amos", "emos", "imos", "iras", "aria", "eria", "iria", "asse", "esse", "isse", "aste", "este", "iste", "ará", "ara", "erá", "era", "irá", "ava", "ira", "ada", "ida", "ais", "eis", "ias", "iam", "ado", "ido", "es", "ei", "am", "em", "ar", "er", "ir", "as", "is", "eu", "iu", "ou", "ia"};
    static List<String> removable_suffix_2 = Arrays.asList(arr_removable_suffix_2);
    static String[] arr_removable_suffix_3 = {"os", "a", "i", "o", "á", "í", "ó"};
    static List<String> removable_suffix_3 = Arrays.asList(arr_removable_suffix_3);

    public static String doStemmer(String palavra) {

        palavra = palavra.replaceAll("ã", "a~");
        palavra = palavra.replaceAll("õ", "o~");

        String palavraOriginal = palavra;

        String R1 = getR1(palavra);
        String R2 = getR2(palavra);
        String RV = getRV(palavra);

        try {
            //STEP 1.1
            for (String suffix : removable_suffix_1) {
//                if (R2.contains(suffix)) {
                if (suffix.length() > R2.length()) {
                    continue;
                }
                String r2s = R2.substring(R2.length() - suffix.length());
                if (r2s.equals(suffix)) {
                    palavra = palavra.replaceAll(suffix, "");
                }
            }

            //STEP 1.2
            if (R2.contains("logías")) {
                palavra = palavra.replaceAll("logías", "log");
            }

            if (R2.contains("logía")) {
                palavra = palavra.replaceAll("logía", "log");
            }

            //STEP 1.3

            if (R2.contains("uciones")) {
                palavra = palavra.replaceAll("uciones", "u");
            }

            if (R2.contains("ución")) {
                palavra = palavra.replaceAll("ución", "u");
            }

            //STEP 1.4

            if (R2.contains("ências")) {
                palavra = palavra.replaceAll("ências", "ente");
                RV = RV.replaceAll("ências", "ente");
            }

            if (R2.contains("ência")) {
                palavra = palavra.replaceAll("ência", "ente");
                RV = RV.replaceAll("ência", "ente");
            }

            //STEP 1.5

            if (R2.contains("amente")) {
                int pos = palavra.indexOf("amente");
                //palavra = palavra.replaceAll("amente", "");
                if (pos - 2 > 0) {
                    if ((R2.charAt(pos - 2) == 'i') && (R2.charAt(pos - 1) == 'v')) {
                        if (pos - 4 > 0) {
                            if ((R2.charAt(pos - 4) == 'a') && (R2.charAt(pos - 3) == 't')) {
                                palavra = palavra.replaceAll("ativamente", "");
                            } else {
                                palavra = palavra.replaceAll("ivamente", "");
                            }
                        }
                    } else if ((R2.charAt(pos - 2) == 'o') && (R2.charAt(pos - 1) == 's')) {
                        palavra = palavra.replaceAll("osamente", "");
                    } else if ((R2.charAt(pos - 2) == 'i') && (R2.charAt(pos - 1) == 'c')) {
                        palavra = palavra.replaceAll("icamente", "");
                    } else if ((R2.charAt(pos - 2) == 'a') && (R2.charAt(pos - 1) == 'd')) {
                        palavra = palavra.replaceAll("adamente", "");
                    }
                }
                palavra = palavra.replaceAll("amente", "");
            }

            //STEP 1.6
            if (R2.contains("mente")) {
                if (R2.contains("antemente")) {
                    palavra = palavra.replaceAll("antemente", "");
                } else if (R2.contains("avelmente")) {
                    palavra = palavra.replaceAll("avelmente", "");
                } else if (R2.contains("ívelmente")) {
                    palavra = palavra.replaceAll("ívelmente", "");
                }
                palavra = palavra.replaceAll("mente", "");
            }

            //STEP 1.7
            if (R2.contains("idades")) {
                if (R2.contains("abilidades")) {
                    palavra = palavra.replaceAll("abilidades", "");
                } else if (R2.contains("icidades")) {
                    palavra = palavra.replaceAll("icidades", "");
                } else if (R2.contains("ividades")) {
                    palavra = palavra.replaceAll("ividades", "");
                }
                palavra = palavra.replaceAll("idades", "");
            }

            if (R2.contains("idade")) {
                if (R2.contains("abilidade")) {
                    palavra = palavra.replaceAll("abilidade", "");
                } else if (R2.contains("icidade")) {
                    palavra = palavra.replaceAll("icidade", "");
                } else if (R2.contains("ividade")) {
                    palavra = palavra.replaceAll("ividade", "");
                }
                palavra = palavra.replaceAll("idade", "");
            }

            //STEP 1.8
            if (R2.contains("ivos")) {
                if (R2.contains("ativos")) {
                    palavra = palavra.replaceAll("ativos", "");
                }
                palavra = palavra.replaceAll("ivos", "");
            }

            if (R2.contains("ivas")) {
                if (R2.contains("ativas")) {
                    palavra = palavra.replaceAll("ativas", "");
                }
                palavra = palavra.replaceAll("ivas", "");
            }

            if (R2.contains("ivo")) {
                if (R2.contains("ativo")) {
                    palavra = palavra.replaceAll("ativo", "");
                }
                palavra = palavra.replaceAll("ivo", "");
            }

            if (R2.contains("iva")) {
                if (R2.contains("ativa")) {
                    palavra = palavra.replaceAll("ativa", "");
                }
                palavra = palavra.replaceAll("iva", "");
            }

            //STEP 1.9
            if (!RV.equals("")) {
                if (RV.contains("iras")) {
                    if (RV.contains("eiras")) {
                        palavra = palavra.replaceAll("iras", "ir");
                    }
                    palavra = palavra.replaceAll("iras", "ir");
                }

                if (RV.contains("ira")) {
                    if (RV.contains("eira")) {
                        palavra = palavra.replaceAll("ira", "ir");
                    }
                    palavra = palavra.replaceAll("ira", "ir");
                }

                if (palavraOriginal.equals(palavra)) {
                    //STEP 2
                    for (String suffix : removable_suffix_2) {
//                        if (RV.contains(suffix)) {
                        if (suffix.length() > RV.length()) {
                            continue;
                        }
                        String rvs = RV.substring(RV.length() - suffix.length());
                        if (rvs.equals(suffix)) {
                            palavra = palavra.replaceAll(suffix, "");
                            RV = RV.replace(suffix, "");
                        }
                    }
                }

                if (palavraOriginal.equals(palavra)) {
                    //STEP 3
                    if (RV.contains("ci")) {
                        palavra = palavra.replaceAll("ci", "");
                    }
                }

                if (palavraOriginal.equals(palavra)) {
                    //STEP 4
                    if ((RV.length() > 0) && removable_suffix_3.contains(RV.charAt(RV.length() - 1) + "")) {
                        palavra = replaceLast(palavra, RV.charAt(RV.length() - 1) + "", "");
                    } else if ((RV.length() > 1) && (RV.charAt(RV.length() - 2) == 'o') && (RV.charAt(RV.length() - 1) == 's')) {
                        palavra = palavra.substring(0, palavra.length() - 2);
                    }
                }

                //STEP 5
                if ((RV.length() > 0) && ((RV.charAt(RV.length() - 1) == 'e') || (RV.charAt(RV.length() - 1) == 'é') || (RV.charAt(RV.length() - 1) == 'ê'))) {
                    if ((RV.length() > 2) && RV.charAt(RV.length() - 3) == 'g' && RV.charAt(RV.length() - 2) == 'u') {
                        palavra = replaceLast(palavra, "ue", "");
                        palavra = replaceLast(palavra, "ué", "");
                        palavra = replaceLast(palavra, "uê", "");
                    } else if ((RV.length() > 2) && RV.charAt(RV.length() - 3) == 'c' && RV.charAt(RV.length() - 2) == 'i') {
                        palavra = replaceLast(palavra, "ie", "");
                        palavra = replaceLast(palavra, "ié", "");
                        palavra = replaceLast(palavra, "iê", "");
                    } else {
                        palavra = palavra.substring(0, palavra.length() - 1);
                    }
                }
                if (palavra.charAt(palavra.length() - 1) == 'ç') {
                    palavra = palavra.substring(0, palavra.length() - 1);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        palavra = palavra.replaceAll("a~", "ã");
        palavra = palavra.replaceAll("o~", "õ");

        return palavra;
    }

    public static String getR1(String palavra) {
        for (int i = 0; i < palavra.length() - 2; i++) {
            if (vogais.contains(palavra.charAt(i) + "")) {
                if (!vogais.contains(palavra.charAt(i + 1) + "")) {
                    return palavra.substring(i + 2, palavra.length());
                }
            }
        }
        return "";
    }

    public static String getR2(String palavra) {
        return getR1(getR1(palavra));
    }

    public static String getRV(String palavra) {
        if (palavra.length() < 3) {
            return "";
        }
        if (!vogais.contains(palavra.charAt(1) + "")) {
            for (int i = 2; i < palavra.length(); i++) {//consoante
                if (vogais.contains(palavra.charAt(i) + "")) {// proxima vogal
                    return palavra.substring(i + 1, palavra.length());
                }
            }
        }

        if (vogais.contains(palavra.charAt(0) + "") && (vogais.contains(palavra.charAt(1) + ""))) {//vogal-vogal
            for (int i = 2; i < palavra.length(); i++) {
                if (!vogais.contains(palavra.charAt(i) + "")) {//proxima consoante
                    return palavra.substring(i + 1, palavra.length());
                }
            }
        }

        if (!vogais.contains(palavra.charAt(0) + "") && (vogais.contains(palavra.charAt(1) + ""))) {//consoante-vogal            
            return palavra.substring(3, palavra.length());
        }
        return "";
    }

    private static String replaceLast(String string, String from, String to) {
        int lastIndex = string.lastIndexOf(from);
        if (lastIndex < 0) {
            return string;
        }
        String tail = string.substring(lastIndex).replaceFirst(from, to);
        return string.substring(0, lastIndex) + tail;
    }

    public static void main(String[] args) {
        String palavra = "feito";
        System.out.println(doStemmer(palavra));
    }
}